/**
 * 给你一个由"1"(陆地)和"0"(水)组成的二维网格，请你计算网格中岛屿的数量。岛屿总是被水包围，并且每座岛屿只能由水平方向和/
 * 或竖直方向上相邻的陆地链接形成。
 * 此外，你可以假设该网格的四条边均被水包围。
 * 示例一:
 * 输入: grid = [
 *  ["1", "1", "1", "1", "0"],
 *  ["1", "1", "0", "1", "0"],
 *  ["1", "1", "0", "0", "0"],
 *  ["0", "0", "0", "0", "0"],
 * ]
 * 输出: 1
 * 输入: grid = [
 *   ["1", "1", "0", "0", "0"],
 *   ["1", "1", "0", "0", "0"],
 *   ["0", "0", "1", "0", "0"],
 *   ["0", "0", "0", "1", "1"],
 * ]
 * 输出: 3
*/
function numOfIsland(grid) {
    // 复制一份网格防止变量污染
    const temp = JSON.parse(JSON.stringify(grid));
    // 统计岛屿数量
    let count = 0;
    // 遍历网格方法
    function dfs(temp, row, col) {
        // 看看网格是否超出边界
        if (row >= temp[0].length || row < 0 || col >= temp.length || col < 0 || temp[col][row] === "0") {
            return;
        } else {
            // 依次遍历网格的上下左右格子
            temp[col][row] = "0";
            dfs(temp, row + 1, col);
            dfs(temp, row - 1, col);
            dfs(temp, row, col + 1);
            dfs(temp, row, col - 1);
        }

    }
    for (let i = 0; i < temp.length; i++) {
        for (let j = 0; j < temp[i].length; j++) {
            // 如果遇见为“1”的陆地就统计上
            if (temp[i][j] === "1") {
                count++;
                temp[i][j] = "0";
                dfs(temp, j + 1, i);
            }
        }
    }
    return count;
}

console.log(numOfIsland([
    ["1", "1", "1", "1", "0"],
    ["1", "1", "0", "1", "0"],
    ["1", "1", "0", "0", "0"],
    ["0", "0", "0", "0", "0"],
]))
console.log(numOfIsland([
    ["1", "1", "0", "0", "0"],
    ["1", "1", "0", "0", "0"],
    ["0", "0", "1", "0", "0"],
    ["0", "0", "0", "1", "1"],
]))